package cn.itcast.bos.dao.qp.impl;

import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.WildcardQuery;
import org.apache.lucene.util.Version;
import org.hibernate.search.jpa.FullTextEntityManager;
import org.hibernate.search.jpa.FullTextQuery;
import org.hibernate.search.jpa.Search;
import org.springframework.data.domain.Pageable;
import org.wltea.analyzer.lucene.IKAnalyzer;

import cn.itcast.bos.domain.qp.WorkOrderManage;

//  spring data  自动 扫描 以Impl 结尾类
public class WorkOrderManageDaoImpl {
	// API 采用 hibernate-search
	@PersistenceContext
	private EntityManager entityManager;

	public void pageQuery(Map<String, Object> results, String conditionName, String conditionValue, Pageable pageRequest) {
		try {
			// 采用lucence 条件分页 索引查询
			// EntityManager == session --->FullTextEntityManager---> FullTextQuery(lucenceQuey)
			// 先使用索引查询 再查询数据库... // 构造luncen查询解析器
			// 查询解析器 对象 poduct = 上海传智
			QueryParser queryParser = new QueryParser(Version.LUCENE_31, conditionName, new IKAnalyzer());
			// 查询 queryParser 解析目标查询条件 ----> 获取 目标用户输入数据
			Query query1 = queryParser.parse(conditionValue);// 完全匹配查询 query1
			// 类似模糊查询 WildcardQuery 模糊查询 采用*
			// Term term = new Term(conditionName, "*"+conditionValue+"*");
			WildcardQuery query2 = new WildcardQuery(new Term(conditionName, "*" + conditionValue + "*"));
			// 可将两个查询合并成一个综合查询
			// query1 和 query2 合并查询 一个查询!
			BooleanQuery booleanQuery = new BooleanQuery();
			booleanQuery.add(query1, Occur.SHOULD);// should 表示 或者关系 or
			booleanQuery.add(query2, Occur.SHOULD);// should 表示 或者关系 or
			// 获取 全文检索查询
			// 全文检索查询对象... // import org.hibernate.search.jpa.Search;
			FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
			// 全文检索 查询对象...
			FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(booleanQuery, WorkOrderManage.class);
			// 3: 分页查询
			// 使用query 分页查询 ..
			int resultSize = fullTextQuery.getResultSize();// 总记录数查询...
			results.put("total", resultSize);// 分页总记录数
			// setFirstResult 起始记录数 调用pageRequest 获取起始记录数 以及每页显示记录
			fullTextQuery.setFirstResult(pageRequest.getOffset());//
			fullTextQuery.setMaxResults(pageRequest.getPageSize());
			List<WorkOrderManage> list = fullTextQuery.getResultList();// 查询的数据....
			results.put("rows", list);
		} catch (ParseException e) {
			e.printStackTrace();
			throw new RuntimeException(e + "索引查询失败了...");
		}
	}

}
